package cn.fornever.tools.svn.assist;

import java.util.Arrays;
import java.util.Date;

/**
 * 从SVN中获取信息时的过滤条件.
 *
 * @author ZhangAY
 */
public class SVNFilter {
    /**
     * 开始版本号.默认0.
     */
    private Long startReversion = 0L;
    /**
     * 结束版本号.-1:HEAD (最新)版本.默认 -1.
     */
    private Long endReversion = -1L;
    /**
     * 起始的提交时间.
     */
    private Date startDate;
    /**
     * 最后提交时间.
     */
    private Date endDate;
    /**
     * 提交用户的用户名.为 {@code null}或空数组则代表所有.
     */
    private String[] username;

    /**
     * 获取的版本最大数量.
     */
    private Long limit;

    /**
     * 开始版本号.默认0.
     *
     * @return 开始版本号.默认0.
     */
    public Long getStartReversion() {
        return startReversion;
    }

    /**
     * 开始版本号.默认0.
     *
     * @param startReversion 开始版本号.默认0.
     */
    public void setStartReversion(Long startReversion) {
        this.startReversion = startReversion;
    }

    /**
     * 结束版本号.-1:HEAD (最新)版本.默认 -1.
     *
     * @return 结束版本号.-1代表最新版本.
     */
    public Long getEndReversion() {
        return endReversion;
    }

    /**
     * 结束版本号.-1:HEAD (最新)版本.默认 -1.
     *
     * @param endReversion 结束版本号.-1代表最新版本.
     */
    public void setEndReversion(Long endReversion) {
        this.endReversion = endReversion;
    }

    /**
     * 起始的提交时间.
     *
     * @return 起始的提交时间.
     */
    public Date getStartDate() {
        return startDate;
    }

    /**
     * 起始的提交时间.
     *
     * @param startDate 起始的提交时间.
     */
    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    /**
     * 最后提交时间.
     *
     * @return 最后提交时间.
     */
    public Date getEndDate() {
        return endDate;
    }

    /**
     * 最后提交时间.
     *
     * @param endDate 最后提交时间.
     */
    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    /**
     * 提交用户的用户名.为 {@code null}或空数组则代表所有.
     *
     * @return 提交用户的用户名.为 {@code null}或空数组则代表所有.
     */
    public String[] getUsername() {
        return username;
    }

    /**
     * 提交用户的用户名.为 {@code null}或空数组则代表所有.
     *
     * @param username 提交用户的用户名.为 {@code null}或空数组则代表所有.
     */
    public void setUsername(String[] username) {
        this.username = username;
    }

    /**
     * 获取的版本最大数量.
     *
     * @return 获取的版本最大数量.
     */
    public Long getLimit() {
        return limit;
    }

    /**
     * 获取的版本最大数量.
     *
     * @param limit 获取的版本最大数量.
     */
    public void setLimit(Long limit) {
        this.limit = limit;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        SVNFilter svnFilter = (SVNFilter) o;

        if (startReversion != null ? !startReversion.equals(svnFilter.startReversion) : svnFilter.startReversion != null) return false;
        if (endReversion != null ? !endReversion.equals(svnFilter.endReversion) : svnFilter.endReversion != null) return false;
        if (startDate != null ? !startDate.equals(svnFilter.startDate) : svnFilter.startDate != null) return false;
        if (endDate != null ? !endDate.equals(svnFilter.endDate) : svnFilter.endDate != null) return false;
        // Probably incorrect - comparing Object[] arrays with Arrays.equals
        if (!Arrays.equals(username, svnFilter.username)) return false;
        return limit != null ? limit.equals(svnFilter.limit) : svnFilter.limit == null;

    }

    @Override
    public int hashCode() {
        int result = startReversion != null ? startReversion.hashCode() : 0;
        result = 31 * result + (endReversion != null ? endReversion.hashCode() : 0);
        result = 31 * result + (startDate != null ? startDate.hashCode() : 0);
        result = 31 * result + (endDate != null ? endDate.hashCode() : 0);
        result = 31 * result + Arrays.hashCode(username);
        result = 31 * result + (limit != null ? limit.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "SVNFilter{" +
                "startReversion=" + startReversion +
                ", endReversion=" + endReversion +
                ", startDate=" + startDate +
                ", endDate=" + endDate +
                ", username=" + Arrays.toString(username) +
                ", limit=" + limit +
                '}';
    }
}
